/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo1.interfazExtendido;

import java.util.Random;
import java.util.LinkedList;
import org.joda.time.LocalTime;
import java.util.List;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 *
 * @author dmolina
 */
public class InterfazComprasTestExtendido extends InterfazTestExtendido {

    /**
     * Comprueba que una reserva reduzca los asientos libres 
     * para ese día y fecha
     */
    @Test
    public void testUnaReserva() {

    List<Itinerario> itinerarios = listado.getItinerarios(origen, destino, hoy);
    

     Random random = new Random();
     int pos = random.nextInt(itinerarios.size());

     Itinerario itinerarioElegido = itinerarios.get(pos);

     int libres = compras.asientosLibres(hoy, itinerarioElegido);
 
     compras.reservaAsiento(itinerarioElegido, hoy);

     int libresDespues = compras.asientosLibres(hoy, itinerarioElegido);

      assertSame(libres, libresDespues+1);

    }

     /**
     * Comprueba que asientos libres se reduzca al reservar cada vez
     */
    @Test
    public void testReservarReduceAsientosLibres() {

        List<Itinerario> itinerarios = listado.getItinerarios(origen, destino, hoy);

        Random random = new Random();
        int pos = random.nextInt(itinerarios.size());

         Itinerario itinerarioElegido = itinerarios.get(pos);

        int libres = compras.asientosLibres(hoy, itinerarioElegido);

        int reservados=0;

        while (compras.asientosLibres(hoy, itinerarioElegido) >0) {
            compras.reservaAsiento(itinerarioElegido, hoy);
            reservados = reservados+1;
        }

        assertSame("No permite reservar tantos asientos como libres", libres, reservados);
    }

    /**
     * Comprueba que se puede cancelar una reservada
     */
     public void testReservaYCancela() {
        List<Itinerario> itinerarios = listado.getItinerarios(origen, destino, hoy);

        Random random = new Random();
        int pos = random.nextInt(itinerarios.size());

        Itinerario itinerarioElegido = itinerarios.get(pos);

        int libresAntes = compras.asientosLibres(hoy, itinerarioElegido);

        List<ReservaTrayecto> reservas = compras.reservaAsiento(itinerarioElegido, hoy);

        int libresDespues = compras.asientosLibres(hoy, itinerarioElegido);

        compras.cancelaReserva(reservas);

        int libresTrasCancelar = compras.asientosLibres(hoy, itinerarioElegido);

        assertSame(libresAntes, libresDespues+1);
        assertSame(libresAntes, libresTrasCancelar);
     }

      @Test(expected=RuntimeException.class)
         public void testCancelaSinReservar() {
         compras.cancelaReserva(new ReservaTrayecto(null,hoy, 5, "cadena"));
     }


     @Test
     public void testReservaYCancelaOtra() {
        List<Itinerario> itinerarios = listado.getItinerarios(origen, destino, hoy);

        Random random = new Random();
        int pos = random.nextInt(itinerarios.size());

        Itinerario itinerarioElegido = itinerarios.get(pos);

        List<ReservaTrayecto> reservas = compras.reservaAsiento(itinerarioElegido, hoy);

         String codigo = reservas.get(0).getCodigoReserva();
         codigo = codigo+"NULO";

         ReservaTrayecto otraReserva = new ReservaTrayecto(reservas.get(0).getTrayecto(),reservas.get(0).getFechaSalida(),reservas.get(0).getNumeroAsiento(),codigo);

         reservas.add(otraReserva);

         try {
            compras.cancelaReserva(reservas);
            fail("Canceló una reserva con falso código");
         } catch (RuntimeException e) { }

     }

     @Test(expected=RuntimeException.class)
     public void testReservaDeMas() {
        List<Itinerario> itinerarios = listado.getItinerarios(origen, destino, hoy);

        Random random = new Random();
        int pos = random.nextInt(itinerarios.size());

         Itinerario itinerarioElegido = itinerarios.get(pos);


        while (compras.asientosLibres(hoy, itinerarioElegido) >0) {
            compras.reservaAsiento(itinerarioElegido, hoy);

        }

         assertTrue(compras.asientosLibres(hoy, itinerarioElegido)==0);
         compras.reservaAsiento(itinerarioElegido, hoy);
     }

          @Test
     public void testLLenaYCancela() {

        List<Itinerario> itinerarios = listado.getItinerarios(origen, destino, hoy);

        for(Itinerario itinerarioElegido : itinerarios){

            int libresInicialmente = compras.asientosLibres(hoy, itinerarioElegido);

            List<List<ReservaTrayecto>> reservas = new LinkedList <List< ReservaTrayecto>>();

            while (compras.asientosLibres(hoy, itinerarioElegido) >0) {
                reservas.add(compras.reservaAsiento(itinerarioElegido, hoy));
            }

            for (List<ReservaTrayecto> reserva: reservas){
                compras.cancelaReserva(reserva);
             }


             int libresFinal = compras.asientosLibres(hoy, itinerarioElegido);
             assertSame(libresInicialmente, libresFinal);


          }
        }

    }

   